home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Inspectors / InspectorPanelDemo / InspectorPanel.m < prev    next >
Text File  |  1995-06-12  |  5KB  |  176 lines

  1. /*
  2.  *    Written by Joe Freeman jfreeman@next.com July 1991.
  3.  *    Use this object at your own risk.  
  4.  *    No support or implication of fitness for use is stated or implied.
  5.  *
  6.  *    InspectorPanel:
  7.  *        This object implements a standard inspector panel, similar to
  8.  *        the inspector panel in InterfaceBuilder.  Inspectors have three 
  9.  *        important parts that define the "inspector" part of its 
  10.  *        functionallity, 
  11.  *            A control to determine current inspector
  12.  *            View where variable part of inspector is be displayed.
  13.  *            View that will be scrolled around in variable part.
  14.  *        This object allows the programmer to make connections to all 
  15.  *        elements of the inspector inside a single nib file. It assumes
  16.  *        that the there is a view that acts as the template for the size
  17.  *        of the changable area, an offscreen window that holds the 
  18.  *        images of the of the inspectors, and some kind of matrix of 
  19.  *        buttons that will determine the current inspector, usually
  20.  *        a popup list.
  21.  *
  22.  *        This Panel assumes that all of the inspectors are tiled in
  23.  *        a single window.  That window (contentView) is scrolled around
  24.  *        behind a ClipView that is the size of a single inspector.
  25.  *
  26.  *        All other functionality of the InspectorPanel is identical to
  27.  *        that of standard Panels.  Any number of non changable views
  28.  *        can coexist with the inspection area.
  29.  *
  30.  *        inspectorView
  31.  *                 is the view where the information will be 
  32.  *        displayed in the inspectorPanel.  It is a ClipView that
  33.  *        gives the InspectorPanel size and location information.
  34.  *
  35.  *        offscreenWindow 
  36.  *                is the window who's content view will be 
  37.  *        moved around inside the inspectorView.  The order of the views
  38.  *        (in reference to the order of the popup list is 
  39.  *            .
  40.  *            .
  41.  *            .
  42.  *            m+1 m+2 m+3 ...
  43.  *            n+1 n+2 n+3 ...
  44.  *            0   1   2
  45.  *        setup the offscreenWindow as:
  46.  *            NOT visible on launch
  47.  *            NO resizebar
  48.  *            NOT deferred
  49.  *
  50.  *
  51.  *        The message 
  52.  *            -updateInspector:
  53.  *        causes the sender to be checked to figure out how the offscreen
  54.  *        window should be displayed in the clipview and notifies the
  55.  *        the delegate of the change.
  56.  *
  57.  */
  58.  
  59.  
  60.  
  61. #import "InspectorPanel.h"
  62.  
  63. #import <appkit/Matrix.h>
  64. #import <appkit/ClipView.h>
  65. #import <appkit/ButtonCell.h>
  66.  
  67. #import <strings.h>
  68.  
  69. @implementation InspectorPanel
  70.  
  71. static char rcsstring[] = 
  72.     "@(#)Object:InspectorPanel.m Developer:Joe Freeman Version:1 August, 1991";
  73.  
  74. /* 
  75.  *
  76.  *    PRIVATE METHODS (should be, anyway)
  77.  *
  78.  */
  79.  
  80. /* this figures out how many panes there are in x and y in the docView
  81.  * and calculates where the current inspector would be in the docView.
  82.  * it then scrolls that under the clipview.  any nXm array is ok
  83.  */
  84. - showInspector:(int)inspectNum
  85. {
  86.     NXRect inspectorSize;
  87.     NXRect docSize;
  88.     int    offCols;        /* number of rows and cols offscreen */
  89.     int    curRow,curCol;        /* the number of the row and col to display */
  90.     
  91.     [inspectorView   getFrame:&inspectorSize];
  92.     [offscreenWindow getFrame:&docSize];
  93.     
  94.     offCols = docSize.size.width / inspectorSize.size.width;
  95.     curRow =  inspectNum / offCols;
  96.     curCol =  inspectNum % offCols;
  97.     
  98.     [inspectorView 
  99.         setDrawOrigin:
  100.              curCol * inspectorSize.size.width  +1
  101.             :curRow * inspectorSize.size.height +1];
  102.     
  103.     if ([delegate respondsTo:@selector(inspectorDidChangeTo:)])
  104.         [delegate inspectorDidChangeTo:inspectNum];
  105.     
  106.     return self;
  107.  
  108. - placeInspectorView:sender
  109. {
  110.     if (offscreenWindow && inspectorView){
  111.         /* first make it the doc of the clipview */
  112.     [offscreenWindow removeFromSuperview];
  113.     [inspectorView setDocView: offscreenWindow];
  114.     
  115.     [self showInspector:0];
  116.     }
  117.     return self;
  118. }
  119.  
  120. /* 
  121.  *
  122.  *    outlet setups
  123.  *
  124.  */
  125.  
  126.  
  127. - setOffscreenWindow:anObject
  128. {
  129.     offscreenWindow = [anObject contentView];
  130.     [self placeInspectorView:self];
  131.     return self;
  132. }
  133.  
  134. - setInspectorView:anObject
  135. {
  136.     NXRect viewFrame;
  137.     if (!strcmp([anObject name],"ClipView") ) 
  138.         inspectorView = anObject;
  139.     else {
  140.         /* lets drop a clipview on this thing */
  141.         [anObject getFrame:&viewFrame];
  142.     viewFrame.origin.x = viewFrame.origin.y = 0.0;
  143.         inspectorView = [[ClipView alloc] initFrame: &viewFrame];
  144.     [anObject addSubview: inspectorView];
  145.     }
  146.     [self placeInspectorView:self];
  147.     return self;
  148. }
  149.  
  150. /* 
  151.  *
  152.  *    PUBLIC METHODS (should be anyway)
  153.  *
  154.  */
  155.  
  156. /* this works for any linear matrix of buttons or controls.  
  157.  * it figures out which way the matrix is running and calculates which 
  158.  * control sent message (kind of like tag=position) and causes inspector update
  159.  */
  160. - updateInspector:sender
  161. {
  162.     int numRows,numCols;
  163.     
  164.     [sender getNumRows:&numRows numCols:&numCols];
  165.     if (numRows> numCols){
  166.         [self showInspector: [sender selectedRow]];
  167.     } else {
  168.         [self showInspector: [sender selectedCol]];
  169.     }
  170.     return self;
  171. }
  172.  
  173.  
  174. @end
  175.